#pragma once
#include <cstdio>
#include <vector>
#include <ctime>
#include <cstdarg>
#include <unistd.h>
#include "LogMessage.hpp"

// 文件名
#define _F __FILE__
// 所在行
#define _L __LINE__

enum level
{
    DEBUG, // 0
    NORMAL, // 1
    WARING, // 2
    ERROR, // 3
    FATAL // 4
};

std::vector<const char*> gLevelMap = {
    "DEB",
    "NOR",
    "WAR",
    "ERR",
    "FAT"
};

#define FILE_NAME "./log.txt"

// 格式化打印日志信息                        
void LogMessage(int level/*日志等级*/, const char* file/*文件名*/, int line/*所在行*/, const char* format, .../*自定义格式*/)
{
    // 选择性打印等级为DEBUG的信息，编译的时候加上命令行定义NO_DEBUG就不会打印DEBUG信息
#ifdef NO_DEBUG
    if(level == DEBUG)  return;
#endif
    // 固定格式
    char FixBuffer[128];
    time_t tm = time(nullptr); // 获取时间戳
    // 日志级别 时间 哪一个文件 哪一行
    snprintf(FixBuffer, sizeof(FixBuffer), "---------------------------------------<%s> |%s|->%d\n%s", \
                                                                                gLevelMap[level], // 等级
                                                                                file, // 文件名
                                                                                line, // 所在行
                                                                                ctime(&tm) // 时间戳转正常时间
                                                                                );

    // 用户自定义格式
    char DefBuffer[128];
    va_list args; // 定义一个可变参数
    va_start(args, format); // 用format初始化可变参数
    vsnprintf(DefBuffer, sizeof DefBuffer, format, args); // 将可变参数格式化打印到DefBuffer中
    va_end(args); // 销毁可变参数

    // 往显示器打
    printf("%s%s\n_______________________________________\n", FixBuffer, DefBuffer);
    
    // 往文件中打
    // FILE* pf = fopen(FILE_NAME, "a");
    // fprintf(pf, "%s%s\n\n", FixBuffer, DefBuffer);
    // fclose(pf);
}

